React Xatolik Chegaralarini hooklar bilan qo'llashni o'rganing va resurslarni yuklash xatolarini samarali boshqarib, foydalanuvchi tajribasi va ilova barqarorligini yaxshilang.
Reactda Resurslarni Mustahkam Yuklash: Hooklar yordamida Xatolik Chegaralarini (Error Boundaries) O'zlashtirish
Zamonaviy veb-ilovalarda resurslarni asinxron yuklash odatiy holdir. API'dan ma'lumotlarni olish, rasmlarni yuklash yoki modullarni import qilish bo'ladimi, resurslarni yuklash paytida yuzaga kelishi mumkin bo'lgan xatolarni boshqarish silliq foydalanuvchi tajribasi uchun juda muhimdir. React Xatolik Chegaralari (Error Boundaries) o'zlarining quyi komponentlar daraxtining istalgan joyida JavaScript xatolarini ushlab olish, ularni qayd etish va butun ilovani ishdan chiqarish o'rniga zaxira foydalanuvchi interfeysini (UI) ko'rsatish mexanizmini taqdim etadi. Ushbu maqolada resurslarni yuklash xatolarini boshqarish uchun React Hooklari bilan birgalikda Xatolik Chegaralaridan qanday samarali foydalanish mumkinligi ko'rib chiqiladi.
Xatolik Chegaralarini (Error Boundaries) Tushunish
React 16 dan oldin, komponent renderi paytida qayta ishlanmagan JavaScript xatoliklari Reactning ichki holatini buzib, keyingi renderlarda tushunarsiz xatolarga olib kelardi. Xatolik Chegaralari o'zlarining quyi komponentlarida yuzaga keladigan xatolar uchun umumiy tutuvchi bloklar vazifasini bajarish orqali bu muammoni hal qiladi. Ular quyidagi hayotiy sikl metodlaridan birini yoki ikkalasini ham amalga oshiradigan React komponentlaridir:
static getDerivedStateFromError(error): Bu statik metod quyi komponentda xatolik yuzaga kelganidan so'ng chaqiriladi. U xatolikni argument sifatida qabul qiladi va komponent holatini yangilash uchun qiymat qaytaradi.componentDidCatch(error, info): Bu hayotiy sikl metodi quyi komponentda xatolik yuzaga kelganidan so'ng chaqiriladi. U xatolikni argument sifatida, shuningdek, qaysi komponent xatolikni yuzaga keltirgani haqida ma'lumotga ega obyektni qabul qiladi. Siz undan xatolik ma'lumotlarini qayd etish uchun foydalanishingiz mumkin.
Muhimi, Xatolik Chegaralari faqatgina ularning quyi daraxtidagi komponentlarning render bosqichida, hayotiy sikl metodlarida va konstruktorlarida yuzaga kelgan xatolarni ushlaydi. Ular quyidagi holatlar uchun xatolarni ushlamaydi:
- Hodisalarni qayta ishlovchilar (event handlers) (quyidagi bo'limda ko'proq ma'lumot oling)
- Asinxron kod (masalan,
setTimeoutyokirequestAnimationFrameqayta chaqiruvlari) - Server tomonidagi renderlash (server-side rendering)
- Xatolik Chegarasining o'zida yuzaga kelgan xatolar (uning quyi komponentlarida emas)
Xatolik Chegaralari va React Hooklari: Kuchli Kombinatsiya
Xatolik Chegaralarini amalga oshirish uchun an'anaviy ravishda sinf komponentlari ishlatilgan bo'lsa-da, React Hooklari yanada ixcham va funksional yondashuvni taklif qiladi. Biz xatolarni boshqarish mantig'ini o'z ichiga olgan va resurslarni yuklash paytida xatolik yuzaga keltirishi mumkin bo'lgan komponentlarni o'rash uchun qulay usulni ta'minlaydigan qayta ishlatiladigan useErrorBoundary hookini yaratishimiz mumkin.
Maxsus useErrorBoundary Hookini Yaratish
Bu yerda useErrorBoundary hookining namunasi keltirilgan:
import { useState, useCallback } from 'react';
function useErrorBoundary() {
const [error, setError] = useState(null);
const resetError = useCallback(() => {
setError(null);
}, []);
const captureError = useCallback((e) => {
setError(e);
}, []);
const ErrorBoundary = useCallback(({ children, fallback }) => {
if (error) {
return fallback ? fallback : An error occurred: {error.message || String(error)};
}
return children;
}, [error]);
return { ErrorBoundary, captureError, error, resetError };
}
export default useErrorBoundary;
Tushuntirish:
useState: Biz xatolik holatini boshqarish uchunuseStatedan foydalanamiz. U dastlab xatolikninullga o'rnatadi.useCallback: BizresetErrorvacaptureErrorfunksiyalarini memoizatsiya qilish uchunuseCallbackdan foydalanamiz. Agar bu funksiyalar prop sifatida uzatilsa, keraksiz qayta renderlarning oldini olish uchun bu yaxshi amaliyotdir.ErrorBoundaryKomponenti: BuuseCallbackbilan yaratilgan funksional komponent bo'lib,childrenva ixtiyoriyfallbackpropini qabul qiladi. Agar holatda xatolik mavjud bo'lsa, u taqdim etilganfallbackkomponentini yoki standart xato xabarini render qiladi. Aks holda, u quyi komponentlarni render qiladi. Bu bizning Xatolik Chegaramiz vazifasini bajaradi. `[error]` bog'liqliklar massivi `error` holati o'zgarganda qayta render qilinishini ta'minlaydi.captureErrorFunksiyasi: Bu funksiya xatolik holatini o'rnatish uchun ishlatiladi. Siz uni resurslarni yuklashdatry...catchbloki ichida chaqirasiz.resetErrorFunksiyasi: Bu funksiya xatolik holatini tozalaydi, bu esa komponentga o'zining quyi komponentlarini qayta render qilish (ehtimol, resursni yuklashga qayta urinish) imkonini beradi.
Xatolarni Boshqarish bilan Resurslarni Yuklashni Amalga Oshirish
Endi, bu hookdan resurslarni yuklash xatolarini boshqarish uchun qanday foydalanishni ko'rib chiqamiz. Foydalanuvchi ma'lumotlarini API'dan oladigan komponentni ko'rib chiqing:
import React, { useState, useEffect } from 'react';
import useErrorBoundary from './useErrorBoundary';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const { ErrorBoundary, captureError, error, resetError } = useErrorBoundary();
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (e) {
captureError(e);
}
};
fetchData();
}, [userId, captureError]);
if (error) {
return (
Foydalanuvchi ma'lumotlarini yuklab bo'lmadi. {user.name}
Email: {user.email}
{/* Boshqa foydalanuvchi ma'lumotlari */}Tushuntirish:
- Biz
useErrorBoundaryhookini import qilamiz. - Biz
ErrorBoundarykomponenti,captureErrorfunksiyasi,errorholati varesetErrorfunksiyasini olish uchun hookni chaqiramiz. useEffecthooki ichida biz API so'rovinitry...catchbloki bilan o'rab olamiz.- Agar API so'rovi paytida xatolik yuzaga kelsa, xatolik holatini o'rnatish uchun
captureError(e)ni chaqiramiz. - Agar
errorholati o'rnatilgan bo'lsa, bizErrorBoundarykomponentini render qilamiz. Biz xato xabari va "Qayta urinish" tugmasini ko'rsatadigan maxsusfallbackpropini taqdim etamiz. Tugmani bosish xatolik holatini tozalash uchunresetErrorni chaqiradi, bu esa qayta renderga va ma'lumotlarni olishga yana bir urinishga sabab bo'ladi. - Agar xatolik yuz bermagan bo'lsa va foydalanuvchi ma'lumotlari yuklangan bo'lsa, biz foydalanuvchi profili ma'lumotlarini render qilamiz.
Resurslarni Yuklash Xatolarining Turli Turlarini Boshqarish
Resurslarni yuklash xatolarining har xil turlari turli xil boshqarish strategiyalarini talab qilishi mumkin. Quyida ba'zi umumiy stsenariylar va ularni qanday hal qilish kerakligi keltirilgan:
Tarmoq Xatolari
Tarmoq xatolari mijoz serverga ulanolmaganda yuzaga keladi (masalan, tarmoq uzilishi yoki serverning ishlamay qolishi tufayli). Yuqoridagi misol `response.ok` yordamida asosiy tarmoq xatolarini allaqachon boshqaradi. Siz yanada murakkab xatolarni aniqlashni qo'shishingiz mumkin, masalan:
//fetchData funksiyasi ichida
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
// Maxsus xato kodlarini boshqarishni qo'shishni o'ylab ko'ring
if (response.status === 404) {
throw new Error("Foydalanuvchi topilmadi");
} else if (response.status >= 500) {
throw new Error("Server xatosi. Iltimos, keyinroq qayta urinib ko'ring.");
} else {
throw new Error(`HTTP xatosi! status: ${response.status}`);
}
}
const data = await response.json();
setUser(data);
} catch (error) {
if (error.message === 'Failed to fetch') {
// Ehtimol, tarmoq xatosi
captureError(new Error('Tarmoq xatosi. Iltimos, internet ulanishingizni tekshiring.'));
} else {
captureError(error);
}
}
Bu holatda, siz foydalanuvchiga tarmoq ulanishida muammo borligini ko'rsatuvchi xabar ko'rsatishingiz va ularga internet ulanishini tekshirishni taklif qilishingiz mumkin.
API Xatolari
API xatolari server xatolik javobini qaytarganda yuzaga keladi (masalan, 400 Bad Request yoki 500 Internal Server Error). Yuqorida ko'rsatilganidek, siz `response.status` ni tekshirib, bu xatolarni mos ravishda boshqarishingiz mumkin.
Ma'lumotlarni Tahlil Qilish (Parsing) Xatolari
Ma'lumotlarni tahlil qilish xatolari serverdan kelgan javob kutilgan formatda bo'lmaganda va uni tahlil qilib bo'lmaganda yuzaga keladi (masalan, yaroqsiz JSON). Siz bu xatolarni response.json() chaqiruvini try...catch bloki bilan o'rash orqali boshqarishingiz mumkin:
//fetchData funksiyasi ichida
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP xatosi! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (error) {
if (error instanceof SyntaxError) {
captureError(new Error('Serverdan ma\'lumotlarni tahlil qilib bo\'lmadi.'));
} else {
captureError(error);
}
}
Rasmlarni Yuklash Xatolari
Rasmlarni yuklash uchun siz <img> tegida onError hodisasini qayta ishlovchidan foydalanishingiz mumkin:
function MyImage({ src, alt }) {
const { ErrorBoundary, captureError } = useErrorBoundary();
const [imageLoaded, setImageLoaded] = useState(false);
const handleImageLoad = () => {
setImageLoaded(true);
};
const handleImageError = (e) => {
captureError(new Error(`Rasmni yuklab bo'lmadi: ${src}`));
};
return (
Rasmni yuklab bo'lmadi.